#ifndef MODBUSTCP_SLAVE_H_
#define MODBUSTCP_SLAVE_H_

#include "../../DATA_Function.h"
#include "../MODBUS_Global.h"

/*该类型卡件私有属性结构体定义*/
typedef struct {
	int Send_MaxTime;					//< 从缓存区发送的最大等待时间（ms）
	int Recv_MaxTime;					//< 从缓存区接收的最大等待时间（ms）
	int Wait_ResponseMSG_MaxTime;		//< 接收主站报文的时间上限
}MODBUSTCP_SLAVE_List_Par_t;

/*卡件可调属性结构体定义*/
typedef struct {
	unsigned short StartAddrOf_AI;		//< AI点起始地址
	unsigned short StartAddrOf_AO;		//< AO点起始地址
	unsigned short StartAddrOf_DI;		//< DI点起始地址
	unsigned short StartAddrOf_DO;		//< DO点起始地址
}MODBUSTCP_SLAVE_Par_t;

/*卡件不可调属性结构体定义*/
typedef struct {
	unsigned char ModuleAddr;			//< 本从机模件地址
	bool Is_Double;						//< 是否为双字MODBUS（true-是，false-否）双字MODBUS为用四个字节发送一个浮点数
	unsigned char Link_No;				//< 级联号
}MODBUSTCP_SLAVE_Sta_t;

/*卡件属性结构体定义*/
struct MODBUSTCP_SLAVE_T
{
	Card_Base_t Base;					//< 卡件基本属性结构体
	MODBUSTCP_SLAVE_Par_t Par;			//< 卡件可调属性结构体
	MODBUSTCP_SLAVE_Sta_t Sta;			//< 卡件不可调属性结构体
};

extern MODBUSTCP_SLAVE_T* MODBUSTCP_SLAVE_t;
extern MODBUSTCP_SLAVE_List_Par_t MODBUSTCP_SLAVE_List_Par;

/*函数*/
void CARD_WORK(MODBUSTCP_SLAVE)();												//< modbus-tcp从站工作函数
void* tMODBUSTCP_SLAVE_WORK(void* arg);											//< modbus-tcp从站接收连接线程
void *tMODBUSTCP_SLAVE_Work_Thread(void* arg);									//< modbus-tcp从站工作线程
bool MODBUSTCP_SLAVE_Channel_Search(Channel_type_e type, unsigned short StartAddr, unsigned short NumOfData, unsigned short Total_Num, bool Is_Double);	//< 寻找存储了数据地址区段的卡件
unsigned short MODBUSTCP_SLAVE_Pos_Search(NAME(MODBUSTCP_SLAVE)* Card_Pt[], NAME(MODBUSTCP_SLAVE)** base, unsigned short Num_Sum[], unsigned short position, unsigned char Link_Num);	//< 根据级联情况寻找规定位置的数据点在卡件中的存储位置
bool MODBUSTCP_SLAVE_Channel_Search(NAME(MODBUSTCP_SLAVE)* Card_Pt[], NAME(MODBUSTCP_SLAVE)** Base_Pt, unsigned short* Pos_Pt, Channel_type_e type, unsigned short StartAddr, unsigned short NumOfData, bool Is_Double, unsigned char Link_Num);
int CHANGE_CARD_LIST_PAR(MODBUSTCP_SLAVE)(Card_Base_t* arg, void** Data);		//< 修改该类型卡件属性
int CHANGE_CARD_PAR(MODBUSTCP_SLAVE)(Card_Base_t* arg, void** Data);			//< 在线修改卡件参数函数
int INIT_CARD_STA(MODBUSTCP_SLAVE)(Card_Base_t* arg, void** Data);				//< 初始化卡件不可调参数结构体
#endif
